package controllers;

import java.util.Date;
import java.util.List;
import java.util.Vector;

import views.UbicacionesTablePanel;
import business.interfaces.ICalendarioReserva;
import business.services.IServicioCanchas;
import business.services.IServicioClientes;
import business.services.IServicioReservas;
import business.services.ServiceException;
import business.services.ServicioCanchas;
import business.services.ServicioClientes;
import business.services.ServicioReservas;

public class ReservasController implements IErrorObservable {
	private List<IErrorObserver> observers;
	private IServicioReservas servicioReservas;
	private IServicioClientes servicioClientes;
	private IServicioCanchas servicioCanchas;

	public ReservasController() {
		observers = new Vector<IErrorObserver>();
		servicioClientes = new ServicioClientes();
		servicioCanchas = new ServicioCanchas();
		servicioReservas = new ServicioReservas(servicioClientes, servicioCanchas);
	}

	public List<ICalendarioReserva> getCanchasDisponibles(Date fecha, Integer hora) {
		List<ICalendarioReserva> canchasDisponibles = null;
		try {
			canchasDisponibles = servicioReservas.getCanchasDisponibles(fecha, hora);
		} catch (ServiceException e) {
			this.notificarErrorObservers(e.getMessage());
		}
		return canchasDisponibles;
	}
	
	public boolean reservarCancha(String dni, Date fecha, Integer hora, Double senia) {
		boolean reservaCancha = true;
		try {
			servicioReservas.reservarCancha(dni, fecha, hora, senia);
		} catch (ServiceException e) {
			reservaCancha = false;
			this.notificarErrorObservers(e.getMessage());
		}
		
		return reservaCancha;
	}

	public void buscarMejorEspacio(String nroDoc, Date fecha, Integer hora) {
		List<ICalendarioReserva> canchasDisponibles = getCanchasDisponibles(fecha, hora);
		UbicacionesTablePanel ubicacionesPanel = new UbicacionesTablePanel(canchasDisponibles, nroDoc);
		ubicacionesPanel.showPanel();
		
	}
	
	public List<IErrorObserver> getErrorObservers() {
		return this.observers;
	}

	public void agregarErrorObserver(IErrorObserver observer) {
		this.observers.add(observer);
	}

	public void removerErrorObserver(IErrorObserver observer) {
		this.observers.remove(observer);
	}

	public void notificarErrorObservers(String error) {
		for (IErrorObserver observer : this.observers) {
			observer.notificarError(error);
		}
	}
}
